package password

import (
	"crypto/rand"
	"encoding/base64"
	"fmt"
	"golang.org/x/crypto/bcrypt"
)

const (
	// 默认的盐值长度
	saltLength = 16
	// bcrypt的默认成本因子
	defaultCost = 10
)

// GenerateHashPassword 生成带盐的哈希密码
func GenerateHashPassword(password string) (string, error) {
	// 生成随机盐值
	salt := make([]byte, saltLength)
	_, err := rand.Read(salt)
	if err != nil {
		return "", fmt.Errorf("生成盐值失败: %v", err)
	}

	// 将密码和盐值组合
	saltedPassword := append([]byte(password), salt...)

	// 使用bcrypt生成哈希
	hash, err := bcrypt.GenerateFromPassword(saltedPassword, defaultCost)
	if err != nil {
		return "", fmt.Errorf("生成哈希密码失败: %v", err)
	}

	// 将盐值和哈希组合并进行base64编码
	combined := append(salt, hash...)
	return base64.StdEncoding.EncodeToString(combined), nil
}

// ComparePasswords 比较密码是否匹配
func ComparePasswords(hashedPwd string, plainPwd string) bool {
	fmt.Println(hashedPwd)
	fmt.Println(plainPwd)
	// 解码存储的密码
	decoded, err := base64.StdEncoding.DecodeString(hashedPwd)
	if err != nil {
		return false
	}

	// 提取盐值和哈希
	salt := decoded[:saltLength]
	hash := decoded[saltLength:]

	// 将输入的密码和盐值组合
	saltedPassword := append([]byte(plainPwd), salt...)

	// 比较密码
	err = bcrypt.CompareHashAndPassword(hash, saltedPassword)
	fmt.Println(err == nil)
	return err == nil
}
